// 联合类型 | 可以连接多个类型
let b: "Male" | "Female" | "Unknown"

b = "Female"

console.log('b :>> ', b);

console.log('b :>> ', b);

// string 类型
let c: string = "hello"
console.log('c string :>> ', c);

// number 类型
let d: number = 1
console.log('d number :>> ', d);

// boolean 类型
let e: boolean = true
console.log('e boolean :>> ', e);


// any 类型 任何类型。
let f: any = true
f = "true"
console.log('f any :>> ', f);


// unknown 类型
let g: unknown = true
g = "true"
console.log('g unknown :>> ', g);


// void 类型
function hello(): void {
  console.log('hello() void :>> ')
}

console.log('void :>> ', hello());

// never 类型
function hello2(): never {
  throw new Error("这是一个never类型");
}

// console.log('never :>> ', hello2());


// object 类型
let t: object;
t = {}
t = function () { }


// {} 用于指定对象可以包含哪些属性
// 语法: {属性名:属性值,属性名:属性值}
// 在属性名后面添加 ? 表示可选
let y: { name: string, age?: number }
y = { name: "张三", age: 18 }
console.log('y :>> ', y);
y = { name: "李四" }
console.log('y :>> ', y);

// 如果不知道属性数量的情况下，可以使用
let u: { name: string, [propName: string]: any }

u = { name: "王五", age: 19 }
console.log('u :>> ', u);
u = { name: "王五", age: 19, gender: "男", adult: true }
console.log('u :>> ', u);


// 用箭头函数，设置函数结束的类型声明
// 语法: (形参1:类型1,形参2:类型2,...) => 返回值类型

let i: (a: number, b: number) => number
i = function (n1, n2) {
  return n1 + n2
}

console.log('i(10,20) :>> ', i(10, 20))


// 数组 声明方式，1.string[]  2.Array<string>
let a1: string[]
a1 = ['a', 'b', 'c']
console.log('a1 :>> ', a1)

let a2: Array<string>
a2 = ['a', 'b', 'c']
console.log('a2 :>> ', a2)


// 元组，就是固定长度的数组
let a3: [string, string, number]
a3 = ["abc", "123", 456]
console.log('a3 :>> ', a3)


// enum 枚举

enum Gender {
  Male,
  Female
}

let i1: { name: string, gender: Gender }
i1 = {
  name: "张无忌",
  gender: Gender.Male
}
console.log('i1 enum :>> ', i1)





